// 1. 引入对应模块 
import store from "@/store"
import Vue from "vue"
import VueRouter from "vue-router"
import routes from './routes'
// 2. 注册路由模块
Vue.use(VueRouter)

// 原型上修改push方法
const originPush = VueRouter.prototype.push  //将VueRouter上的push存储到一个变量当中
const originReplace = VueRouter.prototype.replace  //将VueRouter上的replace存储到一个变量当中

// 修改VueRouter原型上的push 用于解决重复跳转时报错的问题
VueRouter.prototype.push = function(location,okCallBack,errCallBack) {
  if(okCallBack === undefined && errCallBack === undefined){
       // 上面的判断成立的话，表示没有传递这两个参数,location是路径
       originPush.call(this,location).catch(()=>{})
  } else {
    originPush.call(this,location,okCallBack,errCallBack)
  }
}

// 修改VueRouter原型上的replace 用于解决重复跳转时报错的问题
VueRouter.prototype.replace = function(location,okCallBack,errCallBack){
  if(okCallBack === undefined && errCallBack === undefined){
    // 上面的判断成立的话，表示没有传递这两个参数
    originReplace.call(this,location).catch(()=>{})  // 统一处理报错的问题 一劳永逸
  }else {
    originReplace.call(this,location,okCallBack,errCallBack)
  }
}
const router = new VueRouter({
  mode:'history',
  routes,
  // 处理跳转到新页面时的滚动行为
  scrollBehavior(to,from,savedPosition) {
    if(savedPosition) {
      return savedPosition
    } else {
      return {x:0 , y:0}
    }
  },
})

// 添加路由守卫
const whiteList = [
  'home',
  'search',
  'detail',
  'addCartSuccess',
  'shopCart',
  'login',
  'register'
]

// 定义路由全局导航守卫
router.beforeEach((to,from,next)=>{
  if(whiteList.includes(to.name) || store.state.user.userInfo.token) {
    next();
    return;
  }
  next({
    name:'login',
    query:{
      redirect:to.path
    }
  })
})

// 4. 导出路由模块 
export default router